package com.pan.common.redis;

/**
 * @author by panstark
 * @description
 * @notice
 * @date 2020/12/23
 */
public class RedisInfo {


    /**
     *
     * https://www.jianshu.com/p/d3ba7b8ad964
     *
     * redis的两种持久化方式
     *
     * 1）Redis提供了两种持久化方式：RDB和AOF。
     *
     * 2）RDB使用一次性生成内存快照的方式，产生的文件紧凑压缩比更 高，因此读取RDB恢复速度更快。由于每次生成RDB开销较大，无法做到实
     *
     * 时持久化，一般用于数据冷备和复制传输。
     *
     * 3）save命令会阻塞主线程不建议使用，bgsave命令通过fork操作创建子 进程生成RDB避免阻塞。
     *
     * 4）AOF通过追加写命令到文件实现持久化，通过appendfsync参数可以 控制实时/秒级持久化。因为需要不断追加写命令，所以AOF文件体积逐渐变大，需要定期执行重写操作来降低文件体积。
     *
     * 5）AOF重写可以通过auto-aof-rewrite-min-size和auto-aof-rewritepercentage参数控制自动触发，也可以使用bgrewriteaof命令手动触发。
     *
     * 6）子进程执行期间使用copy-on-write机制与父进程共享内存，避免内 存消耗翻倍。AOF重写期间还需要维护重写缓冲区，保存新的写入命令避免数据丢失。
     *
     * 7）持久化阻塞主线程场景有：fork阻塞和AOF追加阻塞。fork阻塞时间 跟内存量和系统有关，AOF追加阻塞说明硬盘资源紧张。
     *
     * 8）单机下部署多个实例时，为了防止出现多个子进程执行重写操作， 建议做隔离控制，避免CPU和IO资源竞争。
     *
     */

    /**
     * redis可以存储二进制流，问题，图片都可以存储
     * String ：最基本数据类型，二进制安全
     * Hash：String元素组成的字典，适用于存储对象
     * List:列表，按照String元素插入顺序排序,插入"aaa","bbb","ccc"，取出后为"ccc","bbb","aaa"
     * Set:String元素组成的无序集合，通过hash表实现，不允许重复
     * Sorted Set:通过分数来为集合中的成员进行从小到大的排序
     * 用于计数的HyperLogLog，用于支持存储地里位置的Geo
     */

    /**
     * 底层数据类型基础
     * 1、简单动态字符串
     * 2、链表
     * 3、字典
     * 4、跳跃表
     * 5、整数集合
     * 6、压缩列表
     * 7、对象
     */

    /**
     * 从海量数据中查询出某一前缀的主键
     * keys pattern ： 查找所有符合给定模式pattern的key
     * KEYS指令一次性返回所有匹配key
     * 键的数量过大导致服务卡顿
     * scan指令可以提取少量key，可用于生产环境
     * SCAN cursor [MATCH pattern] [COUNT count]
     *   基于游标的迭代器，需要基于上一次的游标延续之前的迭代过程
     *   以0作为游标开始一次新的迭代，直到命令返回游标0完成一次遍历
     *   不保证每次执行都返回某个给定数量的元素，支持模糊查询
     *   一次返回的数量不可控，只能是大概率符合count值
     *
     * 可能会取到重复值，要进行去重
     *
     */

    /**
     * 分布式锁需要解决的问题
     * 1、互斥性
     * 2、安全性
     * 3、死锁
     * 4、容错
     *
     * a、SETNX key value：如果key不存在，则创建并赋值
     * 返回值：设置成功，返回1，设置失败，返回0.
     * b、EXPIRE key seconds：
     *   设置key失效时间，当key过期时（生存时间为0），会被自动删除。
     * a、b两步操作可以实现，但是不符合原子性，
     * 因此我们需要使用下面这个命令：set lock4 yy EX 10 NX
     *
     */

    /**
     * 大量key同时过期的注意事项
     *  集中过期，由于清除大量的key很耗时，会出现短暂的卡顿现象
     *解决方案：
     *  在设置key的过期时间的时候，给每个key加上随机值
     */

    /**
     * 单个生产者，单个消费者
     * 实现异步队列
     * rpush（放入数据）
     * lpop（拿出数据）
     * blpop key timeout:阻塞直到队列有消息或者超时
     *
     * 单个生产者，多个消费者
     * pub/sub：主体-订阅模式
     *  发送者（pub）发送消息，订阅者（sub）接收消息
     *  订阅者可以订阅任意数量的频道（topic）
     *  缺点：
     *  消息发布是无状态的，无法保证消息可达
     *  发布后，如client掉线，在登陆上，无法接收到已发布的信息。
     */


    /**
     * Redis如何做持久化：
     *   1、RDB(快照)持久化：保存某个时间点的全部数据快照
     *     命令触发持久化
     *       save:阻塞Redis服务进程，直到RDB文件被创建完毕
     *       BGSAVE:fork出一个子进程来创建RDB文件，不阻塞主服务进程
     *     自动触发持久化：
     *       根据redis.conf 里面的save m n 定时触发（使用的是bgsave）
     *       主从复制时，主节点自动触发
     *       执行 Debug Reload
     *       执行shut down 且没有开启AOF持久化
     *   不同保存策略
     *     save 900 1 (900s内若有一条写入，则备份)
     *     save 300 10
     *     save 60  10000
     *    stop-write-on-bgsave-error yes :当备份进程出错的时候，就停止主线程接收新数据，保护持久化一致性
     *
     *    知识点：copy-on-write
     *
     *    缺点：
     *    内存数据的全量同步，数据量大会由于I/O而严重影响性能
     *    可能会因为Redis挂掉而丢失当前至最近一次快照期间的数据
     *
     *
     *    2、AOF(append-Only-file)持久化：保存写状态
     *      记录下除查询以外的所有变更数据库状态的指令
     *      以append形式追加到AOF文件之中(增量)
     *
     *      打开AOF
     *      修改redis.conf中的
     *      appendonly 值为 yes
     *      appendfsync everysec 每秒进行增加
     *
     *     日志重写解决AOF不断增大的问题：原理如下
     *      a、调用fork（）创建一个子进程
     *      b、子进程把aof写到一个临时文件中，不依赖原来的aof文件
     *      c、主进程持续将新的变动写到内存和原来的AOF文件之中
     *      d、主进程获取子进程重写AOF的完成信号，往新的aof文件中同步增量变动
     *      e、使用新的aof文件替换旧的aof文件
     *
     *  目前生产一般采用RDB与AOF混合的持久化方式，重启时，先加载RDB，再执行AOF
     *
     */

    /**
     * pipeline的好处
     *  1、Pipeline和Linux的管道类似
     *  2、Redis基于请求、响应模式，单个请求处理需要一一应答
     *  3、Pipeline批量执行指令，节省多次IO往返时间
     *  4、有序依赖的指令建议分批发送
     */

    /**
     * redis同步机制
     * 1、主从同步--最终一致性
     * 一般读操作都在slave上，写操作都在master上
     *
     * 主从模式的弊端，就是master挂了，redis将不能提供服务
     *
     * 于是出现了哨兵机制
     * 解决主从同步master宕机后，主从切换问题
     *
     * 留言协议gossip
     */

    /**
     * redis集群
     * 一致性哈希算法：对2的32次方取模
     * hash环的数据倾斜问题
     * 引入虚拟节点（通常将虚拟节点设置为32个）
     */

}
